package com.blog.subject.common.context;

import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 登录上下文对象
 * 用于在多线程环境下保存和获取登录相关的信息
 *
 * @author: Blog
 * @date: 2023/11/26
 */
public class LoginContextHolder {

    private static final InheritableThreadLocal<Map<String, Object>> THREAD_LOCAL
            = new InheritableThreadLocal<>();

    /**
     * 设置登录上下文中的某个键值对
     *
     * @param key
     * @param val
     */
    public static void set(String key, Object val) {
        Map<String, Object> map = getThreadLocalMap();
        map.put(key, val);
    }

    /**
     * 获取登录上下文中特定键对应的值
     *
     * @param key
     * @return
     */
    public static Object get(String key) {
        Map<String, Object> threadLocalMap = getThreadLocalMap();
        return threadLocalMap.get(key);
    }

    /**
     * 获取登录用户ID的方法
     *
     * @return
     */
    public static String getLoginId() {
        return (String) getThreadLocalMap().get("loginId");
    }

    /**
     * 移除当前线程的 THREAD_LOCAL
     */
    public static void remove() {
        THREAD_LOCAL.remove();
    }

    /**
     * 用于获取当前线程的 THREAD_LOCAL 中的 Map 对象，
     * 如果该 Map 不存在，则创建一个新的 ConcurrentHashMap 对象并存储到 THREAD_LOCAL 中。
     *
     * @return
     */
    public static Map<String, Object> getThreadLocalMap() {
        Map<String, Object> map = THREAD_LOCAL.get();
        if (Objects.isNull(map)) {
            map = new ConcurrentHashMap<>();
            THREAD_LOCAL.set(map);
        }
        return map;
    }


}
